# TODO 介绍 set集合的用法
# 什么是Set集合
# 集合是Python中一种无序且不重复的数据结构，用于存储多个唯一的元素。集合是可变的，可以进行添加、删除和修改操作。集合中的元素可以是任意类型的对象，但必须是不可变的，如数字、字符串和元组。
# 集合中的元素必须是不可变的，你不能使用可变的数据类型，如列表、字典或者另一个集合作为集合的元素。
# 集合中的元素是唯一的，不允许有重复的元素。
# 集合是无序的，你不能依赖集合中项目的顺序。

# 创建集合：你可以使用花括号 {} 或者 set() 函数来创建一个新的空集合。需要注意的是，只有花括号 {} 创建的是一个字典，不是集合。
my_set = set()  # 使用 set 函数创建空集合
my_set = {1, 2, 3}  # 使用花括号创建集合，元素为 1，2，3

# 向集合中添加元素：你可以使用 add() 方法向集合中添加元素。
my_set = {1, 2, 3}
my_set.add(4)  # 向集合中添加元素 4
print("当前插入set集合中的元素: 4 遍历后的结果如下:")
for i in my_set:
    print(i)

# 1
# 2
# 3
# 4

# 从集合中移除元素：你可以使用 remove() 或 discard() 方法从集合中移除元素。remove() 在元素不存在时会抛出 KeyError，而 discard() 在元素不存在时不会抛出错误。
my_set = {1, 2, 3}
my_set.remove(1)  # 从集合中移除元素 1，如果元素不存在会抛出 KeyError
# my_set.remove(4)  # 从集合中移除元素 4，如果元素不存在会抛出 KeyError
my_set.discard(2)  # 从集合中移除元素 2，如果元素不存在不会抛出错误
my_set.discard(4)  # 从集合中移除元素 2，如果元素不存在不会抛出错误
print("删除set内的元素:")
for i in my_set:
    print(i)
# 上面代码的执行结果: 3


# 检查元素是否在集合中：你可以使用 in 关键字来检查一个元素是否在集合中。
my_set = {1, 2, 3}
print(1 in my_set)  # 输出：True
print(4 in my_set)  # 输出：False

# 集合的并集、交集、差集和对称差集：你可以使用 union()、intersection()、difference() 和 symmetric_difference() 方法或者对应的运算符 |、&、- 和 ^ 来进行并集、交集、差集和对称差集的运算。
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}

print(set1.union(set2))  # 输出：{1, 2, 3, 4, 5, 6}，并集
print(set1 | set2)  # 输出：{1, 2, 3, 4, 5, 6}，并集
print(set1.intersection(set2))  # 输出：{3, 4}，交集
print(set1 & set2)  # 输出：{3, 4}，交集
print(set1.difference(set2))  # 输出：{1, 2} , 这里是 set1 - set2 的差集,也就是 set1中独有的部分.

# 集合的长度：你可以使用内置的 len() 函数来获取集合中元素的数量。
my_set = {1, 2, 3, 4, 5}
print(len(my_set))  # 输出：5

# 清空集合：你可以使用 clear() 方法来移除集合中的所有元素。
my_set = {1, 2, 3, 4, 5}
my_set.clear()
print(my_set)  # 输出：set()

# 复制集合：你可以使用 copy() 方法来创建集合的一个浅拷贝。
my_set = {1, 2, 3, 4, 5}
new_set = my_set.copy()
print(new_set)  # 输出：{1, 2, 3, 4, 5}

# 更新集合：你可以使用 update() 方法或 |= 操作符来在当前集合的基础上添加其他集合中的元素。
# |= 这是一个运算符, 用于执行“按位或赋值”操作。对于集合来说，|= 对应的操作是更新，它可以用来将一个集合中的元素添加到另一个集合中。
# 与此类似，&= 操作符用于求两个集合的交集，-= 操作符用于求两个集合的差集，^= 操作符用于求两个集合的对称差集。
my_set = {1, 2, 3}
my_set.update({4, 5})
print(my_set)  # 输出：{1, 2, 3, 4, 5}
my_set |= {10, 11, 12}
print(my_set)  # {1, 2, 3, 4, 5, 10, 11, 12}

# 判断集合是否是另一个集合的子集或超集：你可以使用 issubset() 和 issuperset() 方法来判断一个集合是否是另一个集合的子集或超集。
set1 = {1, 2, 3}
set2 = {1, 2, 3, 4, 5}
print(set1.issubset(set2))  # 输出：True
print(set2.issuperset(set1))  # 输出：True

# 当操作集合时，还应注意以下几点：
# 集合是可变的，但不能作为字典的键或另一个集合的元素。
# 如果你需要一个不可变的集合，可以使用 frozenset() 函数。
# 不能在集合中有重复元素。如果你试图添加一个已经存在的元素，Python 不会报错，但元素不会被添加到集合中。

# 关于不可变集合的补充
# 除了可变集合之外，Python还提供了不可变集合（frozenset）。不可变集合是一种不可更改的集合，一旦创建就不能进行添加、删除和修改操作。你可以使用frozenset()函数来创建不可变集合。
# 不是常用的数据类型,通过其他的方式都能是实现一些功能
my_frozen_set = frozenset([1, 2, 3])
# 创建一个字典，其中的键是不可变集合

my_dict = {frozenset({1, 2, 3}): "hello", frozenset({4, 5, 6}): "world"}
# 访问字典的元素
print(my_dict[frozenset({1, 2, 3})])  # 输出 "hello"
print(my_dict[frozenset({4, 5, 6})])  # 输出 "world"
